/*
 ***** BEGIN LICENSE BLOCK *****
 * The contents of this file are subject to the Mozilla Public License
 * Version 1.1 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific language governing rights and limitations
 * under the License.
 *
 * The Original Code is BS1.
 *
 * The Initial Developer of the Original Code is SpaceMan.
 * Portions created by SpaceMan are Copyright (C) 2009
 * SpaceMan. All Rights Reserved.
 *
 * Contributor(s):
 * SpaceMan <sandaimespaceman@gmail.com>
 *
 * Alternatively, the contents of this file may be used under the terms
 * of the GNU Public License (the "GPL License"), in which case the
 * provisions of MPL License are applicable instead of those
 * above. If you wish to allow use of your version of this file only
 * under the terms of the GPL License and not to allow others to use
 * your version of this file under the MPL, indicate your decision by
 * deleting the provisions above and replace them with the notice and
 * other provisions required by the GPL License. If you do not delete
 * the provisions above, a recipient may use your version of this file
 * under either the MPL or the GPL License.
 ***** END LICENSE BLOCK *****
 */
package com.uniteduniverse.apps.BS1_CLI;

import com.uniteduniverse.libs.BrainSpace1.*;
import java.io.*;

/**
 * The BS1 interpreter's main class.
 * @author SpaceMan
 * @version 1.0
 */
public class Main
{
	/**
	 * The version of the interpreter.
	 */
	private static final String Version = "1.0";
	/**
	 * A typical BS1 handler.
	 */
	private static final BS1Handler handler = new BS1Handler()
	{
		@Override
		public String InputCallback()
		{
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			try
			{
				return br.readLine();
			}
			catch (IOException e)
			{
				return " ";
			}
		}

		@Override
		public void OutputCallback(int value)
		{
			System.out.print(Util.StringFromCharCode((char) value));
		}
	};

	/**
	 * @param args the command line arguments
	 */
	public static void main(String[] args)
	{
		if (args.length < 1)
		{
			//Show usage info
			System.err.println(
				"BrainSpace 1.0 Interpreter\n" +
				" File is not specified.\n" +
				" Usage: java -jar BS1-CLI.jar [--flags] <FILE>\n" +
				"  --info: display variables and other info after the program ends.\n" +
				"  --version: display the version.");
			System.exit(1);
		}
		else if (Util.ScanStringFromArray(args, "--version"))
		{
			//display version info
			System.out.println("Version: " + Version);
			System.exit(0);
		}
		else
		{
			try
			{
				//run the file
				String content = Util.FileGetContents(new File(args[args.length - 1]));
				BrainSpace1 context = new BrainSpace1(content, handler);
				context.Run();
				//if user requested to show debug info
				if (Util.ScanStringFromArray(args, "--info"))
				{
					System.out.println("\n" + context);
				}
			}
			// notify user about file not found
			catch (FileNotFoundException ex)
			{
				System.err.println("File Not Found: \n" + ex);
				System.exit(1);
			}
			// catch IO exceptions
			catch (IOException ex)
			{
				System.err.println("IO Error: \n" + ex);
				System.exit(1);
			}
			// to be safe, catch all exceptions
			catch (Exception ex)
			{
				System.err.println("Exception: " + ex);
				System.exit(1);
			}
		}
	}
}
